S7-200 SMART CPU与S7-300 CPU 通过UDP通信,需要在双方都注册服务。S7-300侧调用 T-block 指令(TCON、TDISCON、TUSEND、TURCV),S7-200 SMART侧调用Open User Communication库指令(UDP_CONNECT、DISCONNECT、UDP_SEND、UDP_RECV)来实现。通信方式为双边通信,因此双方的发送和接收指令必须成对出现。
注意: S7-200 SMARTPLC V2.2 版本才开始支持UDP通信,早期版本的CPU需要升级固件到V2.2。
硬件和软件需求及所完成的通信任务
本文采用1个CPU317(6ES7 317-2EK14-0AB0),1个S7-200 SMART PLC为例,介绍它们之间的UDP通信。
硬件:
① S7-300 CPU (固件V3.1)
② S7-200 SMART CPU (固件V2.2)
③ PC (带以太网卡)
④ TP以太网电缆
软件:
① STEP7 V13 SP1
② STEP 7 Micro/WIN SMART V2.2
所完成的通信任务:
① S7-300 将MB1000开始的10 个字节的数据发送到 S7-200 SMART的VB数据区。
② S7-300 读取 S7-200 SMART中的VB数据区到MB2000开始的10个字节 。
1. 使用TIA V13 SP1软件新建一个项目,添加硬件并命名为PLC_3,如图1所示。
图1. 添加新设备
为编程方便,使用CPU属性中定义的时钟位,在设备视图双击CPU设置系统和时钟存储器,如图2所示。
图2. 启用时钟位
2 为PROFINET通信口分配以太网地址,如图3所示。
图3 分配以太网地址
1 .在PLC_3的OB1中调用"TCON"通信指令,如图4 所示。
图4. 定义TCON连接参数(选择UDP连接)
2 .在PLC_3的OB1中调用"TUSEND"发送通信块接口参数,如图5 所示。
图5 调用TUSEND
定义UDP连接参数数据块,新建DB块,创建DB5,命名为UDP_CON,如图6所示。
图6 创建UDP连接参数数据块
定义PLC_3的“TUSEND”发送通信块接口参数,如图7所示。
图7 定义TUSEND接口参数
在UDP_CON DB块内设置连接设备的IP地址与端口号,如图8所示
图8 UDP连接详细参数
TUSEND接口参数说明如表1所示。
表1
CALL TUSEND |
, %DB3 |
//调用TUSEND,使用背景DB块:DB3 |
REQ |
:=%M0.3 |
//使用2Hz的时钟脉冲,上升沿激活发送任务 |
ID |
:=1 |
//连接号,要与连接配置中一致,见图4的连接ID |
LEN |
:=10 |
// 发送数据长度 |
DATA |
:=P#M1000.0 BYTE 10 |
// 发送数据区的数据,M区或者DB块,需要注意DB块要选用绝对寻址 |
ADDR |
:=%DB5 |
//UDP对方连接参数,包括对方IP地址及端口 |
DONE |
:=%M113.0 |
// 任务执行完成并且没有错误,该位置1 |
BUSY |
:=%M113.1 |
// 该位为1,代表任务未完成,不能激活新任务 |
ERROR |
:=%M113.2 |
// 通信过程中有错误发生,该位置1 |
STATUS |
|
// 有错误发生时,会显示错误信息号 |
3 在PLC_3的OB1中调用接受指令TURCV并配置基本参数,如图9所示。
图9 调用TURCV
定义PLC_3的“TURCV”发送通信块接口参数,如图10所示。
图10 定义TURCV接口参数
TURCV接口参数说明如表2所示。
表2 TURCV各参数意义
CALL TURCV |
, %DB4 |
//调用TURCV,使用背景DB块:DB4 |
REQ |
:=%114.0 |
//准备好接受数据 |
ID |
:=1 |
//连接号,要与连接配置中一致,见图4的连接ID |
LEN |
:=10 |
// 接受数据长度 |
DATA |
:=P#M2000.0 BYTE 10 |
// 接受数据区的数据,M区或者DB块,需要注意DB块要选用绝对寻址 |
ADDR |
:=%DB5 |
//UDP对方连接参数,包括对方IP地址及端口 |
DONE |
:=%M112.0 |
// 任务执行完成并且没有错误,该位置1 |
BUSY |
:=%M112.1 |
// 该位为1,代表任务未完成,不能激活新任务 |
ERROR |
:=%M112.2 |
// 通信过程中有错误发生,该位置1 |
STATUS |
|
// 有错误发生时,会显示错误信息号 |
RCVD_LEN |
|
// 实际接受数据的字节数 |
1 打开库如图11所示。
图11 开放式库指令
2 调用UDP_CONNECT如图12所示,各参数意义如图表3所示。
图12 定义UDP_CONNECT接口参数
表3 UDP_CONNECT各参数意义
UDP_CONNECT |
|
//调用UDP_CONNECT |
EN |
:=M6.0 |
//使能输入 |
Req |
:=M6.1 |
//如果 Req = TRUE,CPU 启动连接操作。如果 Req = FALSE,则输出显示连接的当前状态。 |
ConnID |
:=15 |
// CPU 使用连接 ID (ConnID) 为其它指令标识该连接。可能的 ConnID 范围为 0 到 65534。 |
LocPort |
:=2000 |
// LocPort 是本地设备上的端口号。本地端口号范围为 1 到 49151。 |
DONE |
:=M0.0 |
// 当连接操作完成且没有错误时,指令置位 Done 输出。 |
BUSY |
:=M0.1 |
// 当连接操作正在进行时,指令置位 Busy 输出。 |
ERROR |
:=M0.2 |
// 当连接操作完成但发生错误时,指令置位 Error 输出 |
STATUS |
|
// 如果指令置位 Error 输出,Status 输出会显示错误代码。如果指令置位 Busy 或 Done 输出,Status 为零(无错误)。
|
4 分配库存储区如图13所示。
图13 分配库存储区
注意:为保证指令库可以正常工作,分配库存储区的时候,一定不能与程序中使用的其他 V 区地址重叠!!
3 调用UDP_SEND如图14所示,各参数的意义如表4所示。
图14 定义UDP_SEND接口参数
表4 UDP_SEND各参数意义
CALL UDP_SEND |
|
//调用UDP_SEND |
EN |
=M6.2 |
//使能输入 |
Req |
=SM0.5 |
//如果 Req = TRUE,CPU 启动发送操作。如果 Req = FALSE,则输出显示发送操作的当前状态。 |
ConnID |
15 |
//连接 ID (ConnID) 是此发送操作所用连接的编号(连接过程中通过 UDP_CONNECT 定义)。 |
DataLen |
10 |
//DataLen 是要发送的字节数(1 到 1024)。 |
DataPtr |
=&VB1000 |
//DataPtr 是指向待发送数据的指针。这是指向 I、Q、M 或 V 存储器的 S7-200 SMART 指针(例如,&VB100)。 |
IPaddr1 |
192 |
//IPaddr1 是 IP 地址的最高有效字节 |
IPaddr2 |
168 |
//IPaddr2 是 IP 地址的次高有效字节 |
IPaddr3 |
0 |
//IPaddr3 是 IP 地址的次低有效字节。 |
IPaddr4 |
103 |
//IPaddr4 是 IP 地址的最低有效字节。 |
RemPort |
2000 |
//RemPort 是远程设备上的端口号。远程端口号范围为 1 到 49151。 |
Done |
=M2.0 |
// 当连接操作完成且没有错误时,指令置位 Done 输出。 |
Busy |
=M2.1 |
// 当连接操作正在进行时,指令置位 Busy 输出。 |
Error |
=M2.2 |
// 当连接操作完成但发生错误时,指令置位 Error 输出。 |
Status |
|
// 如果指令置位 Error 输出,Status 输出会显示错误代码。如果指令置位 Busy 或 Done 输出,Status 为零(无错误)。 |
4 调用UDP_RCV如图15所示,各参数的意义如表5所示。
图15 定义UDP_RCV接口参数
表5 UDP_SEND各参数意义
CALL UDP_RECV |
|
//调用UDP_RECV |
EN |
=M6.4 |
//使能输入 |
ConnID |
15 |
//CPU 将连接 ID (ConnID) 用于此接收操作(连接过程中定义)。 |
MaxLen |
10 |
// MaxLen 是要接收的最大字节数(例如,DataPt 中缓冲区的大小(1 到 1024))。 |
DataPtr |
=&VB2000 |
// DataPtr 是指向接收数据存储位置的指针。这是指向 I、Q、M 或 V 存储器的 S7-200 SMART 指针(例如,&VB100)。 |
Done |
=M10.0 |
//当接收操作完成且没有错误时,指令置位 Done 输出。当指令置位 Done 输出时,Length 输出有效。 |
Busy |
=M10.1 |
// 当接收操作正在进行时,指令置位 Busy 输出。 |
Error |
=M10.2 |
// 当接收操作完成但发生错误时,指令置位 Error 输出 |
Status |
=MB11 |
// 如果指令置位 Error 输出,Status 输出会显示错误代码。如果指令置位 Busy 或 Done 输出,Status 为零(无错误)。 |
Length |
=MW12 |
//Length 是实际接收的字节数。 |
IPaddr1 |
=MB14 |
//IPaddr1 是 IP 地址的最高有效字节 |
IPaddr2 |
=MB15 |
//IPaddr2是 IP 地址的次高有效字节 |
IPaddr3 |
=MB16 |
//IPaddr3是 IP 地址的次低有效字节。 |
IPaddr4 |
=MB17 |
//IPaddr4 是 IP 地址的最低有效字节。 |
RemPort |
|
//RemPort 是发送消息的远程设备的端口号。 |
5 调用DISCONNECT如图16所示,各参数的意义如表6所示。
图16 定义DISCONNECT接口参数
表6 DISCONNECT各参数意义
CALL DISCONNECT |
|
//调用DISCONNECT |
EN |
=M6.5 |
//使能输入 |
Req |
=M6.6 |
//如果 Req = TRUE,CPU 启动断开连接操作。 |
ConnID |
=15 |
// CPU 使用连接 ID (ConnID) 标识要终止的连接(连接过程中定义)。 |
Done |
=M30.0 |
// 当断开连接操作完成且没有错误时,指令置位 Done 输出 |
Busy |
=M30.1 |
// 当断开连接操作正在进行时,指令置位 Busy 输出。 |
Error |
=M30.2 |
// 当断开连接操作完成但发生错误时,指令置位 Error 输出。 |
Status |
|
// 如果指令置位 Error 输出,Status 输出会显示错误代码。如果指令置位 Busy 或 Done 输出,Status 为零(无错误)。 |
下载两个CPU中的所有硬件组态及程序如图17所示。
图17 监控表